package com.friends.utils.clazz;

import com.friends.utils.bean.BeanUtils;

import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * @author xyy
 * @DateTime 2023/4/4 17:48
 * @ClassName ClassUtils
 */
public class ClassUtils {

    /**
     * 获取自己和父类的所有属性
     *
     * @param clazz
     * @return
     */
    public static List<Field> getAllFields(Class<?> clazz) {
        // 定义属性
        List<Field> fieldList = new ArrayList<>();
        while (clazz != null) {
            //当父类为null的时候说明到达了最上层的父类(Object类)
            fieldList.addAll(Arrays.asList(clazz.getDeclaredFields()));
            //得到父类,然后赋给自己
            clazz = clazz.getSuperclass();
        }
        return fieldList;
    }

    /**
     * 获取自己和父类的所有包含此注解的属性
     * @param clazz
     * @param annotation
     * @return
     */
    public static List<Field> getAllFieldsByAnnotation(Class<?> clazz, Class<? extends Annotation> annotation) {
        return getAllFields(clazz).stream().filter(e->e.isAnnotationPresent(annotation)).collect(Collectors.toList());
    }

    /**
     * 获取一个类中属性的注解中的某个属性值
     *
     * @param clazz           那个类
     * @param name            那个属性
     * @param annotationClass 那个注解
     * @param property        那个注解里的值
     * @return
     */
    public static <T extends Annotation> Object getAnnotationValue(Class<?> clazz, String name, Class<T> annotationClass, String property) {
        List<Field> allFields = getAllFields(clazz);
        for (Field declaredField : allFields) {
            if (declaredField.getName().equals(name)) {
                T annotation = declaredField.getAnnotation(annotationClass);
                if (annotation == null) {
                    return null;
                }
                Map<String, Object> map = BeanUtils.beanToMap(annotation);
                return map.get(property);
            }
        }
        return null;
    }
}
